/**
 * 生产环境管理员账户初始化脚本
 */

import { PrismaClient } from '@prisma/client'
import bcrypt from 'bcryptjs'
import readline from 'readline'

const prisma = new PrismaClient()

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

function question(prompt: string): Promise<string> {
  return new Promise((resolve) => {
    rl.question(prompt, resolve)
  })
}

async function initializeAdmin() {
  console.log('🔐 生产环境管理员账户初始化\n')

  try {
    // 检查是否已有管理员
    const existingAdmin = await prisma.user.findFirst({
      where: { role: 'ADMIN' }
    })

    if (existingAdmin) {
      console.log('⚠️  已存在管理员账户:')
      console.log(`   邮箱: ${existingAdmin.email}`)
      console.log(`   姓名: ${existingAdmin.name}`)
      console.log(`   创建时间: ${existingAdmin.createdAt}`)
      
      const overwrite = await question('\n是否要创建新的管理员账户? (y/N): ')
      if (overwrite.toLowerCase() !== 'y') {
        console.log('操作已取消')
        return
      }
    }

    // 获取管理员信息
    console.log('请输入管理员账户信息:\n')
    
    const name = await question('管理员姓名: ')
    if (!name.trim()) {
      throw new Error('管理员姓名不能为空')
    }

    const email = await question('管理员邮箱: ')
    if (!email.trim() || !email.includes('@')) {
      throw new Error('请输入有效的邮箱地址')
    }

    const password = await question('管理员密码 (至少8位): ')
    if (!password || password.length < 8) {
      throw new Error('密码至少需要8位字符')
    }

    const confirmPassword = await question('确认密码: ')
    if (password !== confirmPassword) {
      throw new Error('两次输入的密码不一致')
    }

    // 加密密码
    console.log('\n🔒 正在加密密码...')
    const hashedPassword = await bcrypt.hash(password, 12)

    // 创建管理员账户
    console.log('👤 正在创建管理员账户...')
    
    const admin = await prisma.user.upsert({
      where: { email },
      update: {
        name,
        password: hashedPassword,
        role: 'ADMIN',
        updatedAt: new Date()
      },
      create: {
        name,
        email,
        password: hashedPassword,
        role: 'ADMIN'
      }
    })

    console.log('\n✅ 管理员账户创建成功!')
    console.log('📋 账户信息:')
    console.log(`   ID: ${admin.id}`)
    console.log(`   姓名: ${admin.name}`)
    console.log(`   邮箱: ${admin.email}`)
    console.log(`   角色: ${admin.role}`)
    console.log(`   创建时间: ${admin.createdAt}`)

    console.log('\n🌐 现在您可以使用以下信息登录管理后台:')
    console.log(`   登录地址: https://your-domain.com/admin/login`)
    console.log(`   邮箱: ${admin.email}`)
    console.log(`   密码: [您刚才设置的密码]`)

    // 生成JWT密钥建议
    if (!process.env.JWT_SECRET || process.env.JWT_SECRET === 'your-secret-key') {
      console.log('\n⚠️  安全提醒:')
      console.log('请设置一个强JWT密钥:')
      console.log('export JWT_SECRET="' + generateRandomSecret() + '"')
    }

  } catch (error) {
    console.error('\n❌ 创建管理员账户失败:', error)
    process.exit(1)
  } finally {
    rl.close()
    await prisma.$disconnect()
  }
}

function generateRandomSecret(): string {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
  let result = ''
  for (let i = 0; i < 64; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return result
}

// 检查数据库连接
async function checkDatabase() {
  try {
    await prisma.$connect()
    console.log('✅ 数据库连接成功')
    return true
  } catch (error) {
    console.error('❌ 数据库连接失败:', error)
    console.log('\n请确保:')
    console.log('1. 数据库服务正在运行')
    console.log('2. DATABASE_URL 环境变量配置正确')
    console.log('3. 数据库表已创建 (运行: npx prisma db push)')
    return false
  }
}

// 主函数
async function main() {
  console.log('🚀 Web聚合导航 - 管理员初始化工具\n')

  // 检查环境
  if (process.env.NODE_ENV !== 'production') {
    console.log('⚠️  当前环境:', process.env.NODE_ENV || 'development')
    const proceed = await question('这不是生产环境，是否继续? (y/N): ')
    if (proceed.toLowerCase() !== 'y') {
      console.log('操作已取消')
      process.exit(0)
    }
  }

  // 检查数据库
  const dbConnected = await checkDatabase()
  if (!dbConnected) {
    process.exit(1)
  }

  // 初始化管理员
  await initializeAdmin()
}

// 运行脚本
if (require.main === module) {
  main()
    .then(() => {
      console.log('\n🎉 初始化完成!')
      process.exit(0)
    })
    .catch((error) => {
      console.error('初始化失败:', error)
      process.exit(1)
    })
}

export { initializeAdmin }
